
class Person {
    private String name;
    private int age;
    public Person clone() throws CloneNotSupportedException {
        return (Person)super.clone();
    }
}
public class Test {
    public static void func(int[] array) {
        if(array == null) {
            throw new RuntimeException("空指针异常");
        }
    }
    public static void main(String[] args) {
        //异常的抛出
        //1.异常只能写在方法体中
        //2.抛出的异常是exception,或exception的子类,不能抛出错误
        //3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类
        //则可以不用处理，直接交给JVM来处理
        //4.如果抛出的是编译时异常,必须由程序员自己解决
        //5.一旦抛出异常,后面的代码无法执行
        func(null);

        //throws:声明异常
        //1.throws必须跟在参数后
        //2.声明的异常必须是exception,或者exception的子类
        //3.可以声明多个异常,但是需要使用逗号隔开,如果两者是父子关系,可以只声明父类异常
        //4. 调用声明抛出异常的方法时，调用者必须对该异常进行处理，或者继续使用throws抛出
    }
    public static void main4(String[] args) {
        //异常的处理
        //防御型编程:LBYL(事前防御型),EAFP(事后认错型)
        //异常关键字:throw try catch finally throws
    }
    public static void main3(String[] args) throws CloneNotSupportedException {
        //throwable -> Error(错误) exception(异常->编译时异常(受查异常) 运行时异常(非受查异常))
        Person person = new Person();
        Person person1 = person.clone();
    }
    public static void main1(String[] args) {
        //String类具有可变性,即在原对象基础上进行修改
        StringBuilder stringBuilder = new StringBuilder("hello");//适合单线程
        stringBuilder.append(" world");
        StringBuffer stringBuffer = new StringBuffer("offer");//存在上锁,适合多线程,速度略微慢于StringBuilder
        stringBuffer.append(" 白富美");

        System.out.println(stringBuilder);
        System.out.println(stringBuffer);

        //String -> StringBuilder
        String str = "1234";
        //使用StringBuilder构造方法进行转化
        StringBuilder stringBuilder1 = new StringBuilder(str);
        //使用StringBuilder.append方法
        StringBuilder stringBuilder2 = new StringBuilder();
        stringBuilder2.append(str);
        System.out.println(stringBuilder1);
        System.out.println(stringBuilder2);
        //StringBuilder -> String
        //调用StringBuilder.toString()方法
        StringBuilder stringBuilder3 = new StringBuilder("hello");
        String str1 = stringBuilder3.toString();
        System.out.println(str1);

        //String,StringBuilder,StringBuffer区别
        //1.String内容不可修改,StringBuilder,StringBuffer内容可以修改
        //2.StringBuilder,StringBuffer大多数方法相同
        //3.StringBuffer采用同步处理,属于线程安全操作
        //StringBuilder采用不同步处理,属于线程不安全操作
    }
}
